using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using MC = System.Text;
using System.Threading;


namespace BasicCSharp
{
    class Kisi
    {
        public string ad { get; set; }
        public string soyad { get; set; }
    }
    /// <summary>
    /// Benim Süper Classım
    /// </summary>
    public class Program
    {

        ///
        /// <summary>
        /// Sistemin başlangıcı olan methoddur
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Console.WriteLine(Guid.NewGuid());
            Console.ReadLine();
        }

        private static void DSLOlusturulmasi()
        {
            Logistik myLogistik = new Logistik();
            myLogistik.tasima();
            myLogistik.TasimaAdet = 12;
        }

        public static int topla(int a, int b)
        {
           throw new NotImplementedException();
        }



        private static void EnBasicException()
        {
            Dovuscu myDovuscu = null;
            myDovuscu.vur();
        }

        private static void KlasikHataninVerilmesi()
        {
            Dovuscu myDovuscu = new Dovuscu();
            myDovuscu.İsim = "Mehmet Ali Brand";
            // myDovuscu.Silahım = new Silahi();
            myDovuscu.Silahım.Agirligi = 10;
            myDovuscu.vur();
            Console.ReadLine();
        }

        private static void DynamicMethodHatasi()
        {
            dynamic myDovuscu = new Dovuscu();
            myDovuscu.vur3();
            Console.ReadLine();
        }

        private static void FarkliSekillerdeTipTanimlama()
        {
            int a = 33;
            var b = 44;
            dynamic c = 55;
            Console.WriteLine("a:{0},b:{1},c:{2}", a, b, c);
            Console.Read();
        }

        private static void MetaDatalıParametreTanimlama()
        {
            string x = "*";
            EkranaKarekterBas(karekter: x);
            Console.Read();
        }

        private static void EkranaKarekterBas(string karekter)
        {
            for (int i = 0; i < 50; i++)
            {
                Console.Write(karekter);
            }
        }












        private static void NamespaceAtamaIslemi()
        {
            MC.StringBuilder str = new MC.StringBuilder();
        }

        private static void SimpleDesignParametreIsimlendirme()
        {
            int s = 2;
            var son = topla(myRakam: s);
        }

        private static int topla(int myRakam)
        {
            return myRakam + 2;
        }


        private static void HesapMakinası()
        {
            int Sonuc = 0, Sayi1 = 0, Sayi2 = 0;
            char CikisYaniti, SecilenIslem;
            do
            {
                Console.Clear();
                SayilarinGirisi(out SecilenIslem, out Sayi1, out Sayi2);
                Sonuc = IslemYap(sonuc: Sonuc, secim: SecilenIslem, sayi1: Sayi1, sayi2: Sayi2);
                Console.WriteLine("Başka İşlem Yapmak İstiyor musunuz? (e/h)");
                CikisYaniti = Convert.ToChar(Console.ReadLine());
            } while (CikisYaniti != 'h');
        }

        private static void SayilarinGirisi(out char secim, out int sayi1, out int sayi2)
        {
            Console.WriteLine("HESAP MAKİNASI");
            Console.WriteLine("Çıkarma İşlemi İçin -");
            Console.WriteLine("Toplamı İşlemi için +");
            Console.WriteLine("Çarpma İşlemi İçin *");
            Console.WriteLine("Bölme İşlemi için /");
            Console.WriteLine("Yapmak İstediğiniz İşlemi seçiniz");
            secim = Convert.ToChar(Console.ReadLine());
            Console.WriteLine("1.Değeri giriniz");
            sayi1 = Convert.ToInt16(Console.ReadLine());
            Console.WriteLine("2.Değeri Giriniz");
            sayi2 = Convert.ToInt16(Console.ReadLine());
        }

        private static int IslemYap(int sonuc, char secim, int sayi1, int sayi2)
        {
            switch (secim)
            {
                case '-':
                    sonuc = sayi1 - sayi2;
                    Console.WriteLine("Çıkarma İşlemi Sonucu: {0}", sonuc);
                    break;
                case '+':
                    sonuc = sayi1 + sayi2;
                    Console.WriteLine("Toplama İşlemi Sonucu: {0}", sonuc);
                    break;
                case '*':
                    sonuc = sayi1 * sayi2;
                    Console.WriteLine("Çarpma İşlemi Sonucu: {0}", sonuc);
                    break;
                case '/':
                    sonuc = sayi1 / sayi2;
                    Console.WriteLine("Bölme İşlemi Sonucu: {0}", sonuc);
                    break;

                default:
                    Console.WriteLine("Hatalı Secım Yaptınız");
                    break;
            }
            return sonuc;
        }



        private static void CarpmaIslemi()
        {
            int sayi1 = 55;
            int sayi2 = 59;
            int sayi3 = 58;
            int sonuc = (sayi1 + sayi2 + sayi3);
            Console.WriteLine(sonuc);
            Console.ReadLine();
        }

        private static void TestOrnek()
        {
            Console.WriteLine("Program başladı");
            toplama(4, 6);
            Console.WriteLine("Program bitti");
            Console.ReadLine();
        }

        /// <summary>
        /// methodun imzası: dönen prm ve içe giren parametre
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <returns></returns>
        public static int toplama(int p1, int p2)
        {
            //throw new NotImplementedException();
            return p1 + p2 + 1;
        }


        private static void JsonNesnesiYaratılmasiVeSusluParentezAtama()
        {
            Kisi myKisi = new Kisi { ad = "Kerim", soyad = "Baran" };
            string json = JsonConvert.SerializeObject(myKisi);
            Console.WriteLine(json);
            Console.ReadLine();
        }



        private static void TipTanımlamaYontemleri()
        {
            Console.WriteLine("Explict Typing(Açık açık)");
            Dovuscu myDovuscu1 = new Dovuscu();
            DovuscuyeBilgileriBagla(myDovuscu1);

            Console.WriteLine("Implicit Typing(Gizli Gizli)");
            var myDovuscu2 = new Dovuscu();
            DovuscuyeBilgileriBagla(myDovuscu2);

            Console.WriteLine("Dynamic Typing(Dinamik)");
            dynamic myDovuscu3 = new Dovuscu();
            DovuscuyeBilgileriBagla(myDovuscu3);

            Console.ReadLine();
        }

        public static Dovuscu DovuscuyeBilgileriBagla(Dovuscu myDovuscu)
        {
            myDovuscu.Email = "muhammetali@gmail.com";
            myDovuscu.İsim = "Muhammet Ali";
            myDovuscu.Kilo = 88;
            myDovuscu.Siklet = "Ağır siklet";
            myDovuscu.Yas = 25;

            return myDovuscu;
        }

        private static void TipTanımlanması()
        {
            //    if(Dovuscu==Dovuscu)
            //        Console.WriteLine("Tanımlar eşitlikle karşılaştırılamaz ");

            Dovuscu myDovuscuX = new Dovuscu();
            if (myDovuscuX is Dovuscu)
                Console.WriteLine("myDovuscuX Dovuscu tipindedir.");

            int mySayi = 35;

            if (myDovuscuX.GetType() == mySayi.GetType())
                Console.WriteLine("myDovuscuX ve mySayi aynı tiptedir.");
            else
                Console.WriteLine("myDovuscuX ve mySayi A tiptedir.");



            Console.ReadLine();
            return;
        }

        private static void isKurallariKullanilmasi()
        {
            DovusLigi myLig = new DovusLigi();
            myLig.OdulMiktari = 500000;//set işlemi
            Console.WriteLine("Ödül Miktarı " + myLig.OdulMiktari);//get
            Console.ReadLine();
        }

        /// <summary>
        ///     
        /// </summary>
        private static void EqualsVeEsitEsitOperaratoruFarki()
        {

        }

        private static void EsitEsitOperatoruStaticObjectMethoduKullanilmasi()
        {
            Dovuscu myDovuscuA = new Dovuscu();
            myDovuscuA.İsim = "Mike Tyson";
            myDovuscuA.Siklet = "Ağır Siklet";
            Dovuscu myDovuscuB = new Dovuscu();
            myDovuscuB.İsim = "Mike Tyson";
            myDovuscuB.Siklet = "Ağır Siklet";

            string durum = myDovuscuA == myDovuscuB ? "eşittir" : "eşit değildir";
            string mesaj = string.Format("İki referans tip birine {0}", durum);
            Console.WriteLine(mesaj);
            Console.ReadLine();
        }

        private static void UlasilamayanKodOrnegi()
        {
            return;
            int c = 55;
        }

        private static void TumDegiskenlerinEqualsIcinKontrolu()
        {
            Dovuscu myDovuscuA = new Dovuscu();
            myDovuscuA.İsim = "Mike Tyson";
            myDovuscuA.Siklet = "Ağır Siklet";
            // Dovuscu myDovuscuB=null;
            Dovuscu myDovuscuB = new Dovuscu();
            myDovuscuB.İsim = "Mike Tyson";
            myDovuscuB.Siklet = "Hafif Siklet";

            string durum = myDovuscuA.Equals(myDovuscuB) ? "eşittir" : "eşit değildir";
            //string durum = myDovuscuA == myDovuscuB ? "eşittir" : "eşit değildir";
            string mesaj = string.Format("İki referans tip birine {0}", durum);
            Console.WriteLine(mesaj);
            Console.ReadLine();
        }

        private static void TiplerinOverrideIleAyrismasi()
        {
            Dovuscu myDovuscuA = new Dovuscu();
            myDovuscuA.İsim = "Mike Tyson";
            Dovuscu myDovuscuB = new Dovuscu();
            myDovuscuB.İsim = "Memoli";
            //myDovuscuB.İsim = "Mike Tyson";
            string durum = myDovuscuA.Equals(myDovuscuB) ? "eşittir" : "eşit değildir";
            //string durum = myDovuscuA == myDovuscuB ? "eşittir" : "eşit değildir";
            string mesaj = string.Format("İki referans tip birine {0}", durum);
            Console.WriteLine(mesaj);
            Console.ReadLine();
        }

        private static void ReferansTipleriniEsitleme()
        {
            Dovuscu myDovuscuHasan = new Dovuscu();
            Dovuscu myDovuscuMike = myDovuscuHasan;

            string durum = myDovuscuHasan == myDovuscuMike ? "eşittir" : "eşit değildir";
            string mesaj = string.Format("İki referans tip birine {0}", durum);
            Console.WriteLine(mesaj);
            Console.ReadLine();
        }



        /// <summary>
        /// http://www.youtube.com/watch?v=koKy_ND2BrM
        /// </summary>
        private static void ReferansTiplerininKarsilastirilmasi()
        {
            Dovuscu myDovuscuHasan = new Dovuscu();
            Dovuscu myDovuscuMike = new Dovuscu();

            string durum = myDovuscuHasan == myDovuscuMike ? "eşittir" : "eşit değildir";
            string mesaj = string.Format("İki referans tip birine {0}", durum);
            Console.WriteLine(mesaj);
            Console.ReadLine();
        }

        private static void ValueTypeKullanimi()
        {
            int a = 30;
            int b = a;
            int c = a;

            a = 35;
            Console.WriteLine(
                String.Format("a:{0},b:{1},c:{2}", a, b, c)
                );
            Console.Read();
        }

        private static void UyelereEmailAtOrnegi()
        {
            int x = 112;
            DovusLigi myLig = new DovusLigi();
            myLig.UyelereEmailAt();
            Console.ReadLine();
        }

        private static void GetHashCodeOrnegi()
        {
            Dovuscu mydovuscu = new Dovuscu();
            Console.WriteLine("mydovuscu hash:" + mydovuscu.GetHashCode());
            Console.ReadLine();
        }

        private static void EmailGondermeOrnegi()
        {
            DovusLigi myLig = new DovusLigi();
            myLig.UyelereEmailAt();
            Console.ReadLine();
        }

        private static void OrnekInstanceAlma()
        {
            for (int i = 0; i < 3; i++)
            {
                Dovuscu myDovuscu = new Dovuscu("Muhammet Ali");
                myDovuscu.vur();
            }

        }

        private static void loopSekansOrnegi()
        {
            for (int i = 0; i < 5; i++)
            {
                string sonuc = CSharpGirisOrnekleri.sonucDondurenMethod();
            }
        }

        private static void tipHatasiAlinmasi()
        {
            List<Dovuscu> myList = new List<Dovuscu>();
            myList.Add(new Dovuscu("Aslı"));
            myList.Add(new Dovuscu("Kerem"));
            myList.Add(new MmaDovuscu("Muhammed"));
            myList.Add(new BoxerDovuscu());
            Object myObj = new Object();
            myList.Add((Dovuscu)myObj);

            Console.ReadLine();
        }

        private static void genericListOrnegi()
        {
            List<Dovuscu> myList = new List<Dovuscu>();
            Dovuscu myAsli = new Dovuscu("Aslı");
            myList.Add(myAsli);
            myList.Add(new Dovuscu("Kerem1"));
            myList.Add(new Dovuscu("Kerem2"));
            myList.Add(new Dovuscu("Kerem3"));
            myList.Add(new Dovuscu("Kerem4"));
            myList.Add(new Dovuscu("Kerem5"));
            myList.Add(new Dovuscu("Kerem5"));
            myList.Add(new Dovuscu("Kerem5"));
            myList.Add(new Dovuscu("Kerem5"));
            myList.Add(new Dovuscu("Kerem5"));
        }

        private static void klasikNullReferansHatasi()
        {
            Object myObject = null;
            Console.WriteLine(myObject.GetHashCode());
        }

        private static void neden10SatirdaYazilir(out Object myObject, out int y)
        {
            myObject = new object();
            y = 11;
            y = 11;
            y = 11;
            y = 11;
            y = 11;
            myObject = null;
            y = 11;
            y = 11;
            y = 11;
            Console.WriteLine(myObject.GetHashCode());
        }

        private static void birdenFazlaSayidaInstanceAlinmasi()
        {
            for (int i = 0; i < 5; i++)
            {
                MmaDovuscu myDovuscu1 = new MmaDovuscu("Muhammet Ali");
                myDovuscu1.vur();
            }
        }

        private static void HashCodeKullanimi()
        {
            object myObj = new Object();
            int myhashCode = myObj.GetHashCode();
            int myHashCode1 = "kariyer mimarı".GetHashCode();
            int myHashCode2 = "kariyer mimarı".GetHashCode();
            int x = 55;
            int y = 55;
            int myHashCode3 = x.GetHashCode();
            int myHashCode4 = y.GetHashCode();

            bool mydogru = true;
            bool myYalnis = false;
            int myHashCode5 = mydogru.GetHashCode();
            int myHashCode6 = myYalnis.GetHashCode();

            decimal myDec = 123.2324M;
            int myHashCode7 = myDec.GetHashCode();
        }

        private static void constructorYaratmaOrnegi()
        {
            Dovuscu myDovuscu1 = new Dovuscu();
            Dovuscu myDovuscu2 = new Dovuscu("Rıfat");
            Dovuscu myDovuscu3 = new Dovuscu("Erdem", 33, "Ağır Siklet");
        }





        private static void cpuHiziGoruntule()
        {
            Console.WriteLine("Program başladı");
            for (int i = 0; i < 1000; i++)
            {
                int y = 990 * 88;
                Console.WriteLine(y);
            }
            Console.WriteLine("Bitti");
            Console.ReadLine();
        }

        private static void JsonKutuphanesininKullanilmasi()
        {
            Dovuscu myDovuscu = new Dovuscu();
            myDovuscu.İsim = "Orhan Gencebay";
            myDovuscu.Kilo = 125;
            myDovuscu.Siklet = "Ağır Siklet";
            myDovuscu.Yas = 49;

            string json = JsonConvert.SerializeObject(myDovuscu);
            Console.WriteLine(json);
            Console.ReadLine();
        }


        private static void polyMorfismOrnek()
        {
            Console.WriteLine("Program başladı");

            //MmaDovuscu myDovuscu1 = new MmaDovuscu();
            //myDovuscu1.İsim = "Kent";
            //myDovuscu1.jetonAt(myDovuscu1);
            //BoxerDovuscu myDovuscu2 = new BoxerDovuscu();
            //myDovuscu2.İsim = "Shera";
            //myDovuscu2.jetonAt(myDovuscu2);

            MmaDovuscu myDovuscu1 = new MmaDovuscu();
            myDovuscu1.İsim = "Kent";
            myDovuscu1.jetonAt(myDovuscu1);
            BoxerDovuscu myDovuscu2 = new BoxerDovuscu();
            myDovuscu2.İsim = "Shera";
            myDovuscu2.jetonAt(myDovuscu2);


            Console.WriteLine("Program bitti");
            Console.ReadLine();
        }













        private static void constructorOrnegi()
        {
            Console.WriteLine("Program başladı");

            //Classlar referanstypedır!!!
            Dovuscu myDovuscu = new Dovuscu();
            myDovuscu.İsim = "Ahmet Kral";
            myDovuscu.Kilo = 95;
            myDovuscu.Siklet = "Ağır Siklet";
            myDovuscu.Yas = 25;

            Dovuscu mydovuscu2 = new Dovuscu("Kimbo slice");

            Console.WriteLine("Program bitti");
            Console.ReadLine();
        }


    }
}
